﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
using Odense_Kommune.Model;
using Odense_Kommune.Interfaces;

namespace Odense_Kommune.Controller
{

    public class DBController
    {
        #region database forbindelse
        private MySqlConnection connection;
        private string server;
        private string database;
        private string uid;
        private string password;

        public DBController()
        {
            InitializeConnection();
        }

        public void InitializeConnection()
        {
            server = "mysql16.unoeuro.com";
            database = "dqi_nu_db";
            uid = "dqi_nu";
            password = "giffer1603";
            string connectionString;
            connectionString = "SERVER=" + server + ";" + "DATABASE=" +
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

            //connection = new SqlConnection("Data Source=msdb3.surftown.dk;Initial Catalog=mitoden_dbgr19;User ID=mitoden_dbgr19;Password=dmgruppebjbu");
            connection = new MySqlConnection(connectionString);
        }

        public bool Login(string Navn, string Kode)
        {
            if (OpenConnection())
            {
                string Query = "login";

                if (this.OpenConnection() == true)
                {
                    //create command and assign the query and connection from the constructor
                    MySqlCommand cmd = new MySqlCommand(Query, connection);
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;

                    cmd.Parameters.Add(new MySqlParameter("Navn", Navn));
                    cmd.Parameters.Add(new MySqlParameter("Kode", Kode));

                    //Execute command
                    cmd.ExecuteNonQuery();

                    //close connection
                    this.LukForbindelse();
                }

                return true;
            }

            connection.Close();
            return (false);
        }

        //open connection to database
        public bool OpenConnection()
        {
            try
            {
                connection.Open();

                return true;
            }
            catch (SqlException ex)
            {
                //When handling errors, you can your application's response based 
                //on the error number.
                //The two most common error numbers when connecting are as follows:
                //0: Cannot connect to server.
                //1045: Invalid user name and/or password.
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine("Cannot connect to server.  Contact administrator");
                        break;

                    case 1045:
                        Console.WriteLine("Invalid username/password, please try again");
                        break;
                }
                return false;
            }
        }

        public void LukForbindelse()
        {
            connection.Close();
        }
        #endregion

        #region rutine kald SpørgeSkema
        public ISpørgeskemaCol HentAlleSkemaer()
        {
            MySqlCommand cmd = new MySqlCommand("HentAlleSkemaer", connection);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            connection.Open();
            MySqlDataReader datareader = cmd.ExecuteReader();

            ISpørgeskemaCol skemaListe = new SpørgeskemaCollection();
            try
            {
                
                while (datareader.Read())
                {
                    ISpørgeskema spørgeskema = new Spørgeskema();

                    //skema.EntryID = Convert.ToInt32(datareader["ID"]); // skal laves til at se et ID
                    spørgeskema.Navn = Convert.ToString(datareader["Navn"]);
                    spørgeskema.DatoforventetAfslut = Convert.ToDateTime(datareader["DatoForventetAfslut"]);
                    spørgeskema.EgenVurdering = Convert.ToBoolean(datareader["Egenvurdering"]);
                    spørgeskema.Kommentar = Convert.ToString(datareader["Kommentar"]);
                    spørgeskema.KortsigtetVirkning = Convert.ToString(datareader["KortsigtetVirkning"]);
                    spørgeskema.LangsigtetVirkning = Convert.ToString(datareader["LangsigtetVirkning"]);
                    spørgeskema.MellemlangVirkning = Convert.ToString(datareader["MellemlangVirkning"]);


                    skemaListe.ListeafSpørgeskema.Add(spørgeskema);
                }
            }
            catch (MySqlException ex)
            {
                throw ex;

            }
            finally
            {
                if (connection == null)
                    datareader.Close();
                connection.Close();
            }
            return skemaListe;
        }

        public void OpretSkema(ISpørgeskema spørgeskema)
        {
            try
            {
                MySqlCommand cmd = new MySqlCommand("OpretSkema", connection);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add(new MySqlParameter("param1", spørgeskema.LangsigtetVirkning));
                cmd.Parameters.Add(new MySqlParameter("param2", spørgeskema.MellemlangVirkning));
                cmd.Parameters.Add(new MySqlParameter("param3", spørgeskema.KortsigtetVirkning));
                cmd.Parameters.Add(new MySqlParameter("param4", spørgeskema.DatoforventetAfslut));
                cmd.Parameters.Add(new MySqlParameter("param5", spørgeskema.Kommentar));
                cmd.Parameters.Add(new MySqlParameter("param6", spørgeskema.EgenVurdering));
                cmd.Parameters.Add(new MySqlParameter("param7", spørgeskema.Navn));

                connection.Open();
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }
            catch (MySqlException ex)
            {
                throw ex;

            }
            finally
            {
                if (connection == null)
                    connection.Close();
            }
        }
        public int RetSkema(Spørgeskema spørgeskema)
        {
            try
            {
                MySqlCommand cmd = new MySqlCommand("RetSkema", connection);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add(new MySqlParameter("paramkey", spørgeskema.ID));
                cmd.Parameters.Add(new MySqlParameter("param1", spørgeskema.LangsigtetVirkning));
                cmd.Parameters.Add(new MySqlParameter("param2", spørgeskema.MellemlangVirkning));
                cmd.Parameters.Add(new MySqlParameter("param3", spørgeskema.KortsigtetVirkning));
                cmd.Parameters.Add(new MySqlParameter("param4", spørgeskema.DatoforventetAfslut));
                cmd.Parameters.Add(new MySqlParameter("param5", spørgeskema.Kommentar));
                cmd.Parameters.Add(new MySqlParameter("param6", spørgeskema.EgenVurdering));

                int i = cmd.ExecuteNonQuery();
                return i;
            }
            catch (MySqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (connection == null)
                    connection.Close();
            }

        }

        public int SletSkema(Spørgeskema spørgeskema)
        {
            try
            {
                MySqlCommand cmd = new MySqlCommand("SletSkema", connection);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add(new MySqlParameter("param1", spørgeskema.ID));

                int i = cmd.ExecuteNonQuery();
                //cmd.Connection.Close();
                return i;
            }
            catch (MySqlException ex)
            {
                throw ex;

            }
            finally
            {
                if (connection == null)
                    connection.Close();
            }


        }

        #endregion

        #region rutine kald Borger
        /// <summary>
        /// Opretter en ny borger, med argumenterne givet.
        /// </summary>
        /// <param name="Cpr"></param>
        /// <param name="navn"></param>
        /// <param name="Beskrivelse"></param>
        /// <param name="begyndt"></param>
        /// <param name="afslut"></param>
        /// <param name="Type"></param>
        /// <param name="køn"></param>
        /// <returns></returns>
        public bool NyBorger(string Cpr, string navn, string Beskrivelse, string begyndt, string afslut, string Type, string køn)
        {
            string Query = "INSERT INTO Borger (Cpr, Beskrivelse, PåbegyndtForløb, AfsluttetForløb, AfslutType, Køn, Navn) VALUES('" + Cpr + "','" + Beskrivelse + "','" + begyndt + "','" + afslut + "','" + Type + "','" + køn + "','" + navn + "')";

            if (this.OpenConnection() == true)
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand cmd = new MySqlCommand(Query, connection);

                //Execute command
                cmd.ExecuteNonQuery();

                //close connection
                this.LukForbindelse();
            }

            return true;
        }

        /// <summary>
        /// Redigerer en borger. ID bruges til at finde den borger der skal redigeres. Alle felter bliver overskrevet med de nye værdier givet til funktionen.
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="Cpr"></param>
        /// <param name="navn"></param>
        /// <param name="Beskrivelse"></param>
        /// <param name="begyndt"></param>
        /// <param name="afslut"></param>
        /// <param name="Type"></param>
        /// <param name="køn"></param>
        /// <returns></returns>
        public bool RedigerBorger(string ID, string Cpr, string navn, string Beskrivelse, string begyndt, string afslut, string Type, string køn)
        {
            string Query = "UPDATE Borger SET Cpr='" + Cpr + "', Beskrivelse'" + Beskrivelse + "', PåbegyndtForløb='" + begyndt + "', AfsluttetForløb='" + afslut + "', AfslutType='" + Type + "', Køn='" + køn + "', Navn='" + navn + "' WHERE ID=" + ID + "'";

            if (this.OpenConnection() == true)
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand cmd = new MySqlCommand(Query, connection);

                //Execute command
                cmd.ExecuteNonQuery();

                //close connection
                this.LukForbindelse();
            }

            return true;
        }

        /// <summary>
        /// Returnerer alle parametre forbundet med en borger. De returneres som en array-liste, hvor argument 0, er borgerens unikke ID i databasen, og alle andre argumenter ligger i samme rækkefølger som undtastet.
        /// Hvis et af argumenterne til funktionen ikke kendes, brug da en tom string ("").
        /// </summary>
        /// <param name="Cpr"></param>
        /// <param name="Fornavn"></param>
        /// <param name="Beskrivelse"></param>
        /// <param name="Kommentar"></param>
        /// <param name="DatoSlut"></param>
        /// <param name="SpørgeType"></param>
        /// <param name="køn"></param>
        /// <returns></returns>
        public List<Borger> FindBorger(Borger Bob)
        {
            string Cpr = Convert.ToString(Bob.CPR);
            string Fornavn = Bob.Fornavn;
            string Efternavn = Bob.Efternavn;
            string Kommentar = Bob.Efternavn;
            string Alder = Convert.ToString(Bob.Alder);
            string Kaldenavn = Bob.Kaldenavn;
            string DatoStart = Convert.ToString(Bob.DatoStart);
            string DatoSlut = Convert.ToString(Bob.DatoSlut);
            //string SpørgeType = Bob.Sp;
            string køn = Bob.Køn;

            string Query = "SELECT ID, Cpr, Fornavn, Efternavn, Kommentar, Alder, Kaldenavn, Datostart, Datoslut, Afsluttype, Køn FROM Borger WHERE";
            if (Cpr != "")
                Query += " Cpr=" + Cpr + ",";
            if (Fornavn != "")
                Query += " Fornavn=" + Fornavn + ",";
            if (Efternavn != "")
                Query += " Efternavn=" + Efternavn + ",";
            if (Kommentar != "")
                Query += " Kommentar=" + Kommentar + ",";
            if (Alder != "")
                Query += " Alder=" + Alder + ",";
            if (Kaldenavn != "")
                Query += " Kaldenavn=" + Kaldenavn + ",";
            if (DatoStart != "")
                Query += " Datostart=" + DatoStart + ",";
            if (DatoSlut != "")
                Query += " AfsluttetForløb=" + DatoSlut + ",";
            if (køn != "")
                Query += " Køn=" + køn + ",";

            Query = Query.Remove(Query.ToCharArray().Count() - 1);
            //string Query = "SELECT ID, Cpr, Fornavn, Efternavn, Kommentar, Alder, Kaldenavn, Datostart, Datoslut, Afsluttype, Køn FROM Borger WHERE Cpr = " + Cpr;

            if (this.OpenConnection() == true)
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand cmd = new MySqlCommand(Query, connection);

                //Execute command
                MySqlDataReader dataReader = cmd.ExecuteReader();

                List<string>[] list = new List<string>[11];
                list[0] = new List<string>();
                list[1] = new List<string>();
                list[2] = new List<string>();
                list[3] = new List<string>();
                list[4] = new List<string>();
                list[5] = new List<string>();
                list[6] = new List<string>();
                list[7] = new List<string>();
                list[8] = new List<string>();
                list[9] = new List<string>();
                list[10] = new List<string>();
                while (dataReader.Read())
                {
                    list[0].Add(dataReader["ID"] + "");
                    list[1].Add(dataReader["Cpr"] + "");
                    list[2].Add(dataReader["Fornavn"] + "");
                    list[3].Add(dataReader["Efternavn"] + "");
                    list[4].Add(dataReader["Kommentar"] + "");
                    list[5].Add(dataReader["Alder"] + "");
                    list[6].Add(dataReader["Kaldenavn"] + "");
                    //list[7].Add(dataReader.GetDataTypeName(7));
                    try
                    {
                        list[7].Add(dataReader.GetDateTime(7).ToString());
                    }
                    catch
                    {
                        list[7].Add(null);
                    }
                    // list[7].Add(DateTime.Now.ToString());
                    try
                    {
                        list[8].Add(dataReader.GetDateTime(8).ToString());
                    }
                    catch
                    {
                        list[8].Add(null);
                    }
                    /*list[8].Add(dataReader["Datoslut"] + "");*/
                    list[9].Add(dataReader["Afsluttype"] + "");
                    list[10].Add(dataReader[10] + "");
                }

                List<Borger> Borgere = new List<Borger>();


                int n = 0;
                while (n < list[1].Count)
                {
                    //Borgere.Add(new Borger(Convert.ToInt64(list[1][n]), Convert.ToInt32( list[5][n]), list[2][n], list[3][n], list[4][n], Convert.ToDateTime( list[7][n]), list[10][n], list[9][n]));
                    //if (list[7][n]!=null)
                    //Borgere.Add(new Borger(Convert.ToInt64(list[1][n]), Convert.ToInt32(list[5][n]), list[2][n], list[3][n], list[4][n], Convert.ToDateTime(list[7][n]), list[10][n], list[9][n]));
                    //else
                    //Borgere.Add(new Borger(Convert.ToInt64(list[0][n]), Convert.ToInt32(list[0][n]), list[2][n], list[3][n], list[4][n], DateTime.Now, list[10][n], list[9][n]));

                    n++;
                }

                //close connection
                this.LukForbindelse();

                return (Borgere);
            }

            return (null);
        }
        #endregion

        #region rutine kald Leverandør
        //kunne evt. være databinding, da der ikke ofte redigeres i disse atributter.
        #endregion
    }
}

